package com.molichuxing.gateway.api.services;

import com.molichuxing.framework.result.ResponseResult;
import com.molichuxing.gateway.bff.financial.entity.response.ContractRenegeParamsVo;
import com.molichuxing.gateway.bff.orders.entity.request.create.*;
import com.molichuxing.gateway.bff.orders.entity.request.modify.*;
import com.molichuxing.gateway.bff.orders.entity.response.*;
import org.springframework.validation.BindingResult;

import java.util.List;

/**
 * 订单web接口
 * 
 * @author zoumingyu
 * @date 2019年9月29日
 *
 */
public interface OrderApiService {

	/**
	 * 订单列表-移动端
	 * 
	 * @return
	 */
	public ResponseResult<List<OrderMobileListVo>> orderList(String token, String appVersion);

	/**
	 * 订单详情-专属里程
	 * 
	 * @param token
	 * @param orderCode
	 * @return
	 */
	public ResponseResult<OrderExclusivelDetailsVo> orderExclusivelDetails(String token, String appVersion,
			Long orderCode);

	/**
	 * 订单详情-订阅里程
	 * 
	 * @param token
	 * @param orderCode
	 * @return
	 */
	public ResponseResult<OrderSubscribeDetailsVo> orderSubscribeDetails(String token, String appVersion,
			Long orderCode);

	/**
	 * 专属里程-还款明细
	 * 
	 * @param token
	 * @param orderCode
	 * @return
	 */
	public ResponseResult<RepaymentVo> exclusivelRepaymentList(String token, Long orderCode);

	/**
	 * 生成专属订单
	 * 
	 * @param createVo
	 * @return
	 */
	public ResponseResult<OrderVo> createOrderExclusivel(String token, String source, String deviceNum,
			OrderExclusivelCreateVo createVo, BindingResult bindingResult);

	/**
	 * 生成订阅订单
	 * 
	 * @param createVo
	 * @return
	 */
	public ResponseResult<OrderVo> createOrderSubscribe(String token, String source, String deviceNum,
			OrderSubscribeCreateVo createVo, BindingResult bindingResult);

	/**
	 * 生成加购订单
	 * 
	 * @param createVo
	 * @return
	 */
	public ResponseResult<OrderVo> createOrderPurchase(String token, String source, String deviceNum,
			OrderPurchasedCreateVo createVo, BindingResult bindingResult);

	/**
	 * 生成续订订单
	 * 
	 * @param createVo
	 * @return
	 */
	public ResponseResult<OrderVo> createOrderRenew(String token, String source, String deviceNum,
			OrderRenewCreateVo createVo, BindingResult bindingResult);

	/**
	 * 订单取消
	 * 
	 * @param token
	 * @param orderCode
	 * @return
	 */
	public ResponseResult<Boolean> cancel(String token, TradeCancelModifyVo modifyVo, BindingResult bindingResult);

	/**
	 * 验证是否可加购
	 * 
	 * @param token
	 * @param orderCode
	 * @return
	 */
	public ResponseResult<ReletVerifyVo> verifyPurchase(String token, Long orderCode);

	/**
	 * 验证是否可续订
	 * 
	 * @param token
	 * @param orderCode
	 * @return
	 */
	public ResponseResult<ReletVerifyVo> verifyRenew(String token, Long orderCode);

	/**
	 * 验车报告确认
	 * 
	 * @param token
	 * @param orderCode
	 * @return
	 */
	public ResponseResult<ReportVo> reportConfirm(String token, ReportModifyVo modifyVo, BindingResult bindingResult);

	/**
	 * 验车报告预览
	 * @param token
	 * @param orderCode
	 * @return
	 */
	public ResponseResult<CheckReportVo> checkReport(String token, Long orderCode);
	/**
	 * 大屏订单信息
	 * 
	 * @param token
	 * @param deviceNum
	 * @return
	 */
	public ResponseResult<List<OrderAioVo>> aioOrder(String token, String deviceNum);

	/**
	 * 大屏订单提车
	 * 
	 * @param modifyVo
	 * @return
	 */
	public ResponseResult<DeliveryResultVo> delivery(String token, String counselorToken, String deviceNum,
			TradeDeliveryModifyVo modifyVo, BindingResult bindingResult);

	/**
	 * 大屏订单还车
	 * 
	 * @param modifyVo
	 * @return
	 */
	public ResponseResult<ReturnCarResultVo> returnCar(String token, String counselorToken, String deviceNum,
			ReturnCarModifyVo modifyVo, BindingResult bindingResult);

	/**
	 * 查询订单还车结果
	 * 
	 * @param orderCode
	 * @return
	 */
	public ResponseResult<ReturnCarResultVo> returnCarResult(Long orderCode);

	/**
	 * 取消退租
	 * 
	 * @param token
	 * @param modifyVo
	 * @param bindingResult
	 * @return
	 */
	public ResponseResult<Boolean> renegeCancel(String token, RenegeCancelModifyVo modifyVo,
			BindingResult bindingResult);

	/**
	 * 订单退租退款人信息
	 * 
	 * @param orderCode
	 * @return
	 */
	public ResponseResult<OrderPayeeVo> orderPayee(String token, Long orderCode);

	/**
	 * 订单退租退款人信息新增
	 *
	 * @param token
	 * @param createVo
	 * @return
	 */
	public ResponseResult<Boolean> orderPayee(String token, OrderPayeeCreateVo createVo, BindingResult bindingResult);

	/**
	 * 查询退租解除协议参数
	 *
	 * @param token
	 * @param orderCode
	 * @return
	 */
	public ResponseResult<ContractRenegeParamsVo> renegeContractParams(String token, Long orderCode);
}
